from django.core.cache import cache

class CacheService:
    @staticmethod
    def get(resource_type, resource_id):
        """
        从缓存中获取数据。
        :param resource_type: 资源类型（如 "image", "dish", "order"）
        :param resource_id: 资源 ID
        :return: 缓存值或 None
        """
        key = f"{resource_type}:{resource_id}"
        return cache.get(key)

    @staticmethod
    def set(resource_type, resource_id, value, timeout=60 * 60 * 24):
        """
        将数据写入缓存。
        :param resource_type: 资源类型
        :param resource_id: 资源 ID
        :param value: 缓存值
        :param timeout: 缓存过期时间（秒，默认 1 天）
        """
        key = f"{resource_type}:{resource_id}"
        cache.set(key, value, timeout=timeout)

    @staticmethod
    def delete(resource_type, resource_id):
        """
        删除缓存中的数据。
        :param resource_type: 资源类型
        :param resource_id: 资源 ID
        """
        key = f"{resource_type}:{resource_id}"
        cache.delete(key)

    @staticmethod
    def get_or_set(resource_type, resource_id, data_loader, timeout=60 * 60 * 24):
        """
        获取缓存数据，如果缓存未命中，则调用 data_loader 加载数据并写入缓存。
        :param resource_type: 资源类型
        :param resource_id: 资源 ID
        :param data_loader: 数据加载函数（返回值会被缓存）
        :param timeout: 缓存过期时间（秒，默认 1 天）
        :return: 缓存值
        """
        key = f"{resource_type}:{resource_id}"
        data = cache.get(key)
        if not data:
            data = data_loader()
            if data is not None:
                cache.set(key, data, timeout=timeout)
        return data

    @staticmethod
    def clear_all():
        """
        清空所有缓存。
        """
        cache.clear()


if __name__ == "__main__":
    # 确保 Django 的缓存后端已正确配置
    # 这里我们假设使用的是默认的内存缓存（LocMemCache）
    import os
    import django

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "TasteLink0.settings")
    django.setup()
    # 定义资源类型和 ID
    resource_type = "image"
    resource_id = "123"

    # 定义模拟数据加载函数
    def mock_data_loader():
        print("Loading data from source...")
        return {"image_data": "base64_encoded_string", "mime_type": "image/jpeg"}

    # 测试步骤 1: 清空缓存以确保干净的环境
    print("Clearing all cache...")
    CacheService.clear_all()

    # 测试步骤 2: 检查缓存中是否没有数据
    print("Checking if cache is empty...")
    cached_data = CacheService.get(resource_type, resource_id)
    if cached_data is None:
        print("Cache is empty as expected.")
    else:
        print("Unexpected data found in cache:", cached_data)

    # 测试步骤 3: 使用 get_or_set 方法加载数据到缓存
    print("Using get_or_set to load data into cache...")
    data = CacheService.get_or_set(resource_type, resource_id, mock_data_loader)
    print("Data loaded:", data)

    # 测试步骤 4: 再次从缓存中获取数据，确认缓存命中
    print("Fetching data from cache again...")
    cached_data = CacheService.get(resource_type, resource_id)
    if cached_data:
        print("Cache hit. Data retrieved:", cached_data)
    else:
        print("Cache miss. No data found.")

    # 测试步骤 5: 删除缓存中的数据
    print("Deleting data from cache...")
    CacheService.delete(resource_type, resource_id)
    cached_data = CacheService.get(resource_type, resource_id)
    if cached_data is None:
        print("Data successfully deleted from cache.")
    else:
        print("Failed to delete data from cache:", cached_data)

    # 测试步骤 6: 再次使用 get_or_set 方法加载数据
    print("Using get_or_set again to reload data...")
    data = CacheService.get_or_set(resource_type, resource_id, mock_data_loader)
    print("Data reloaded:", data)